import Cookies from "js-cookie";
import { storageLocal, storageSession } from "@pureadmin/utils";
import { useUserStoreHook } from "@/store/modules/user";

export interface TokenInfo<T> {
  /** token */
  accessToken: string;
  /** `accessToken`的过期时间（时间戳） */
  expires: T;
  /** 用于调用刷新accessToken的接口时所需的token */
  refreshToken: string;
  cookieName: string;
  cookieValue: string;
  /** 用户名 */
  nickname?: string;
  avatar?: string;
  /** 当前登陆用户的角色 */
  roles?: Array<string>;
  permissions?: Array<string>;
}

export interface UserInfo {
  /** 用户名 */
  nickname?: string;
  /**头像*/
  avatar?: string;
  /** 当前登陆用户的角色 */
  roles?: Array<string>;
  /**权限*/
  permissions?: Array<string>;
}

export const sessionTokenKey = "token-info";
export const sessionUserKey = "user-info";
export const TokenKey = "authorized-token";

/** 获取`token` */
export function getToken(): TokenInfo<number> {
  // 此处与`TokenKey`相同，此写法解决初始化时`Cookies`中不存在`TokenKey`报错
  return storageLocal().getItem(sessionTokenKey);
}

/**
 * @description 设置`token`以及一些必要信息并采用无感刷新`token`方案
 * 无感刷新：后端返回`accessToken`（访问接口使用的`token`）、`refreshToken`（用于调用刷新`accessToken`的接口时所需的`token`，`refreshToken`的过期时间（比如30天）应大于`accessToken`的过期时间（比如2小时））、`expires`（`accessToken`的过期时间）
 * 将`accessToken`、`expires`这两条信息放在key值为authorized-token的cookie里（过期自动销毁）
 * 将`nickname`、`roles`、`refreshToken`、`expires`这四条信息放在key值为`user-info`的sessionStorage里（浏览器关闭自动销毁）
 */
export function setToken(data: TokenInfo<number>) {
  if (data) {
    const { accessToken, expires, cookieName, cookieValue } = data;
    const cookieString = JSON.stringify({ accessToken, expires });

    expires > 0
      ? Cookies.set(TokenKey, cookieString, {
          expires: expires,
        })
      : Cookies.set(TokenKey, cookieString);
    Cookies.set(cookieName, cookieValue);

    storageLocal().setItem(sessionTokenKey, data);
  }
}

export function getUser(): UserInfo {
  return storageSession().getItem(sessionUserKey);
}

export function setUser(data: UserInfo) {
  const {
    nickname,
    avatar = "https://avatars.githubusercontent.com/u/44761321?v=4",
    roles,
    permissions,
  } = data;

  useUserStoreHook().SET_USERNAME(nickname);
  useUserStoreHook().SET_AVATAR(avatar);
  useUserStoreHook().SET_ROLES(roles);
  useUserStoreHook().SET_PERMISSIONS(permissions);
  storageSession().setItem(sessionUserKey, {
    nickname,
    avatar,
    roles,
    permissions,
  });
}

/** 删除`token`以及key值为`user-info`的session信息 */
export function removeToken(name: string) {
  Cookies.remove(TokenKey);
  Cookies.remove(name);
  sessionStorage.clear();
  storageLocal().clear();
  storageSession().clear();
}

/** 格式化token（jwt格式） */
export const formatToken = (token: string): string => {
  return "Bearer " + token;
};
